﻿using Microsoft.EntityFrameworkCore;
using System.Linq.Expressions;
using wwl.Contract.Dtos.Common;         // 包含分页结果等通用数据传输对象
using wwl.Contract.Dtos.Requests.Rbac;
using wwl.Contract.Interfaces.Common;  // 包含通用接口（如IWrapper）
using wwl.Contract.Interfaces.Rbac;    // 包含租户仓储接口（ITenantRepository）
using wwl.DataAccess.Repositories.Common; // 包含通用仓储基类（GenericRepository）
using wwl.Domain.Entities.Rbac;        // 包含租户实体类（Tenant）

namespace wwl.DataAccess.Repositories.Rbac
{
  /// <summary>
  /// 租户仓储实现类
  /// 继承通用仓储基类GenericRepository<Tenant>，并实现租户专属接口ITenantRepository
  /// 负责租户实体（Tenant）的业务相关数据访问操作
  /// </summary>
  public class TenantRepository : GenericRepository<Tenant>, ITenantRepository
  {
    /// <summary>
    /// 构造函数，通过依赖注入获取数据操作包装器，并传递给基类
    /// </summary>
    /// <param name="wrapper">数据操作包装器，封装底层数据访问逻辑</param>
    public TenantRepository(IEfWrapper wrapper) : base(wrapper)
    {
    }

    /// <summary>
    /// 异步检查指定租户编码是否已存在（支持排除指定ID的租户，用于编辑场景去重）
    /// </summary>
    /// <param name="tenantCode">要检查的租户编码</param>
    /// <param name="excludeId">可选参数，需要排除的租户ID（如编辑时排除自身）</param>
    /// <returns>存在则返回true，否则返回false</returns>
    public async Task<bool> ExistsByCodeAsync(string tenantCode, string? excludeId = null)
    {
      // 构建查询：筛选租户编码等于目标编码的记录（使用无跟踪查询，性能更优）
      var query = QueryNoTracking().Where(x => x.TenantCode == tenantCode);

      // 若指定了排除ID，则在查询中排除该ID对应的租户
      if (!string.IsNullOrEmpty(excludeId))
      {
        query = query.Where(x => x.Id != excludeId);
      }

      // 检查查询结果是否存在记录（AnyAsync高效判断是否有数据）
      return await query.AnyAsync();
    }

    /// <summary>
    /// 异步获取租户分页数据（支持多条件筛选）
    /// </summary>
    /// <param name="request">租户分页请求参数（包含分页信息和筛选条件）</param>
    /// <returns>包含租户数据的分页结果对象</returns>
    public async Task<PagedResult<Tenant>> GetPagedAsync(TenantPagedRequest request)
    {
      // 初始化筛选条件表达式（默认为null，即无筛选）
      Expression<Func<Tenant, bool>>? filter = null;

      // 当存在至少一个有效筛选条件时，构建筛选表达式
      if (!string.IsNullOrWhiteSpace(request.TenantCode) ||
          !string.IsNullOrWhiteSpace(request.TenantName) ||
          !string.IsNullOrWhiteSpace(request.Status))
      {
        // 构建多条件组合筛选：
        // 1. 若传入租户编码，则筛选包含该编码的记录
        // 2. 若传入租户名称，则筛选包含该名称的记录
        // 3. 若传入状态，则筛选状态匹配的记录（将字符串状态转为枚举匹配）
        filter = x =>
            (string.IsNullOrWhiteSpace(request.TenantCode) || x.TenantCode.Contains(request.TenantCode)) &&
            (string.IsNullOrWhiteSpace(request.TenantName) || x.TenantName.Contains(request.TenantName)) &&
            (string.IsNullOrWhiteSpace(request.Status) || x.Status.ToString() == request.Status);
      }

      // 调用基类的分页方法，传入分页请求和构建的筛选条件，返回分页结果
      return await GetPagedAsync(request, filter);
    }
  }
}